#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *MyStrcpy(char *dst, const char *src)
{
#if 0
    int length = strlen(src); 
    for (int idx = 0; idx < length; idx++)
    {
        *dst++ = *src++;
    }
#endif
    char *startPoint = dst;
    while (*src != '\0')
    {
        *dst = *src;
        src++;
        dst++;
    }
    *dst = *src;
    return startPoint;
    // printf("%s\n", dst);
    // printf("%s\n", src);
}

int main()
{
    /*  字符串函数:
        1.strlen函数   :计算字符串的长度
            int strlen(const char *str);
        2.strcmp函数   :比较两个字符串的大小
            int strcmp(const char *str1, const char *str2);
        3.strcat函数   :拼接两个字符串
            char * strcat(char * dst, const char * src);
        4.strcpy函数   :拷贝字符串
            char * strcpy(char * dst, const char * src);
    */

    /*  函数的三要素:
        1.函数名
        2.函数返回值
        3.函数参数 -形参(传入传出参数)
            传入参数:不可以被修改的
            传出参数:一定被修改的。
    */

#if 0
    // 字符串
    // char *dst ="hello!";

    // 字符数组
    char dst[] = "hellogfdhrth!";
    const char *src = "zhangsan";

    char *res=MyStrcpy(dst, src);

    printf("%s\n", src);
    printf("%s\n", dst);
    printf("%s\n", res);
#endif

    // 字符串
    //动态分配内存 -如果不释放内存就会导致内存泄漏,
    char *str = (char *)malloc(sizeof(char) * 100);
    if (str==NULL)
    {
        printf("malloc error:");
        exit(-1);
    }
    
    //清除脏数据
    memset(str,0,sizeof(char)*100);




    strcpy(str, "jsetc");

    printf("str =%s\n", str);

    // 1.如何生成可调试的二进程程序???
    // gcc -g XXX.c YYY.c -o main
    // 2.如何定位段错误呢?gdb main


    //释放内存 :valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
    free(str);

    //指针初始化为NULL
    int * pNum=NULL;


    /*
        导致内存泄露的三种方式:
            1,野指针(未初始化的指针: int * pNum;)
            2,malloc分配的空间不释放
            3,踩内存(占用了不属于自己的空间)
    */

    return 0;
}